home *** CD-ROM | disk | FTP | other *** search
/ MASPC 1 / MASPC_1.iso / Demos / Demo DIV / DATA / PRG / JUEGOS / GALAX.PRG < prev    next >
Encoding:
Text File  |  1997-11-27  |  17.1 KB  |  527 lines

  1.  
  2. //------------------------------------------------------------------------------
  3. // TITULO:      GALAX
  4. // AUTOR:       LUIS SUREDA
  5. // FECHA:       2/15/97
  6. //------------------------------------------------------------------------------
  7.  
  8. PROGRAM galax;
  9.  
  10. CONST
  11.     ancho_escuadron=12;  // Tamaño del escuadrón
  12.     alto_escuadron=4;
  13.     // Total de enemigos en el escuadrón
  14.     n_enemigos= ancho_escuadron*alto_escuadron;
  15.  
  16.     ancho_nave=20;      // Distancia horizontal entre enemigos
  17.     alto_nave=20;       // Distancia vertical entre enemigos
  18.     movi_escuadron=1;   // Numero de pixel que se moverá el escuadrón
  19.  
  20. GLOBAL
  21.     x_escuadron=60;     // Esquina superior-izquierda del escuadrón
  22.     y_escuadron=20;
  23.  
  24.     opcion=0;           // Opción del menú
  25.  
  26.     laser=0;            // Identificadores de sonido
  27.     laser2=0;
  28.     ataque3=0;
  29.     ataque1=0;
  30.     explo=0;
  31.  
  32.     puntuacion;         // Puntuación del jugador
  33.     max_puntuacion=0;   // Maxima puntuación obtenida
  34.     nivel;              // Nivel actual (1..n)
  35.     siguiente_nivel;    // =1 Cuando el nivel esta completado
  36.     vidas;              // Vidas restantes
  37.     otra_vida;          // =1 Cuando la nave ha chocado con el enemigo o el fuego
  38.     enemigos;           // Numero activo de enemigos
  39.     cambia_dir;         // 1=Cambia la dirección de movimiento del escuadrón
  40.     dir;                // Dirección de movimiento del escuadrón 0=izq.,1=der.
  41.     bandera_misil;      // Bandera del misil . 0=no preparado 1=preparado
  42.     idnave;             // Identificador de la nave
  43.  
  44.     // Formación inicial: 0 vacío, 1 tipo_nave_1, 2 tipo_nave_2, 3 tipo_nave_3
  45.  
  46.     formacion[n_enemigos]=3,3,3,3,3,0,0,3,3,3,3,3,
  47.                           0,2,2,2,0,2,2,0,2,2,2,0,
  48.                           2,1,2,1,0,2,2,0,1,2,1,2,
  49.                           1,1,0,1,1,0,0,1,1,0,1,1;
  50.  
  51.     tipo_enemigo[n_enemigos];  // Formación en juego
  52.  
  53. LOCAL
  54.     numero=0;          // Numero de enemigos
  55.  
  56. PRIVATE
  57.     contador0=0;       // Contador
  58.  
  59. BEGIN
  60.  
  61.     load_fpg("galax\galax.fpg");  // Carga gráficos
  62.     load_fpg("galax\galax2.fpg"); // Carga pantalla de presentación
  63.     load_fnt("galax\galax.fnt");  // Carga fuentes
  64.  
  65.  
  66.     laser=load_pcm("galax\laser.pcm",0);   // Carga sonidos
  67.     laser2=load_pcm("galax\laser2.pcm",0);
  68.     explo=load_pcm("galax\laser3.pcm",0);
  69.     ataque3=load_pcm("galax\buiu.pcm",0);
  70.     ataque3=load_pcm("galax\fx1.pcm",0);
  71.  
  72.     priority=-1;
  73.  
  74.     LOOP        // Bucle de menú
  75.  
  76.         load_pal("galax\galax2.fpg");
  77.         put_screen(1,1);    // Muestra pantalla de presentación
  78.  
  79.         fade_on();
  80.  
  81.         opcion=0;           // Valores iniciales
  82.         vidas=3;
  83.         nivel=1;
  84.         scan_code=0;
  85.         // Repite hasta que se pulse una tecla
  86.         REPEAT              // Bucle de menú
  87.             FRAME;
  88.         UNTIL (scan_code<>0)
  89.  
  90.         // Si se pulsa escape se sale del juego
  91.         IF (key (_esc)) BREAK; END
  92.  
  93.         // Si no, comienza a jugar y reinicia la variable de muerto
  94.         otra_vida=0;
  95.  
  96.         // Comprueba si se ha hecho record la última vez y pone a cero la puntuacion
  97.         IF (puntuacion>max_puntuacion) max_puntuacion=puntuacion; END
  98.         puntuacion=0;
  99.  
  100.         // Borra todos los textos que hubiera
  101.         delete_text(all_text);
  102.  
  103.         fade_off();
  104.         load_pal("galax\galax.fpg");
  105.         put_screen(0,1);    // Enseña pantalla de fondo
  106.  
  107.         // Escribe los textos necesarios
  108.         write(1,0,0,0,"PUNTUACION");
  109.         write(1,320,0,2,"MAX-PUNTUACION");
  110.         write(1,110,0,0,"VIDAS");
  111.         write(1,160,0,0,"NIVEL");
  112.         write_int(1,0,8,0,&puntuacion);
  113.         write_int(1,120,10,0,&vidas);
  114.         write_int(1,175,10,0,&nivel);
  115.         write_int(1,320,10,2,&max_puntuacion);
  116.  
  117.         // Selecciona el número de imagenes por segundo
  118.         set_fps(34,0);
  119.         fade_on();
  120.  
  121.         idnave=nave();      // Identificador para nave
  122.  
  123.         LOOP                // Bucle general
  124.             siguiente_nivel=0;
  125.  
  126.             // Prepara la formación
  127.             x_escuadron=60;
  128.             enemigos=0;
  129.  
  130.             // Crea los enemigos mediante un bucle
  131.             FOR (contador0=0;contador0<n_enemigos;contador0++)
  132.                 tipo_enemigo[contador0]=formacion[contador0];
  133.                 IF (tipo_enemigo[contador0]<>0)
  134.                     enemigos++;     // Incrementa el número de enemigos vivos
  135.                     enemigo(contador0,tipo_enemigo[contador0]);
  136.                 END
  137.             END
  138.  
  139.             dir=1;         // Inicialmente el escuadrón se mueve a la derecha
  140.             cambia_dir=0;
  141.  
  142.             REPEAT         // Bucle del juego
  143.                 REPEAT     // Bucle de nivel
  144.                     FRAME;
  145.                     IF (dir==0)         // Mueve el escuadrón según la dirección
  146.                         x_escuadron-=movi_escuadron;
  147.                         IF (x_escuadron<0) cambia_dir=1; END
  148.                     ELSE
  149.                         x_escuadron+=movi_escuadron;
  150.                         IF (x_escuadron>320) cambia_dir=1;  END
  151.                     END
  152.  
  153.                     IF (cambia_dir==1)  // Cambia la dirección
  154.                         dir=dir XOR 1;
  155.                         cambia_dir=0;
  156.                     END
  157.  
  158.                     IF (key(_esc))      // Aborta el juego
  159.                         otra_vida=1;
  160.                         vidas=0;
  161.                     END
  162.  
  163.                 UNTIL (siguiente_nivel OR otra_vida)
  164.  
  165.                 // Espera explosión
  166.                 WHILE (get_id(TYPE explosion))
  167.                     FRAME;
  168.                 END
  169.  
  170.                 IF (otra_vida==1)       // El jugador pierde una nave
  171.                     vidas--;
  172.                     otra_vida=0;
  173.                     fade_off();
  174.                     //Termina procesos
  175.                     signal(TYPE enemigo,s_kill);
  176.                     signal(TYPE fuego,s_kill);
  177.                     // Crea nuevos procesos para siguiente vida
  178.                     idnave=nave();
  179.                     FOR (contador0=0;contador0<n_enemigos;contador0++)   // Crea los enemigos
  180.                         IF (tipo_enemigo[contador0]<>0)
  181.                             enemigo(contador0,tipo_enemigo[contador0]);
  182.                         END
  183.                     END
  184.                     fade_on();
  185.                 END
  186.                 IF (siguiente_nivel==1) BREAK; END
  187.             UNTIL (vidas<0)
  188.  
  189.             IF (vidas<0) BREAK; END
  190.  
  191.             fade_off();
  192.             fade_on();
  193.  
  194.             nivel++;    // Cambia el nivel
  195.         END
  196.         // Borra procesos y textos
  197.         let_me_alone();
  198.         delete_text(all_text);
  199.     END     // Fin del juego
  200.     creditos();
  201. END
  202.  
  203. //------------------------------------------------------------------------------
  204. // Proceso nave
  205. // Crea y controla la nave
  206. //------------------------------------------------------------------------------
  207.  
  208. PROCESS nave();
  209.  
  210. PRIVATE
  211.     velocidad=0;    // Velocidad de la nave
  212.  
  213. BEGIN
  214.     graph=13;           // Selecciona gráfico y coordenadas
  215.     x=160;
  216.     y=188;
  217.     bandera_misil=0;    // Sirve para disparar solo un disparo cada vez
  218.     LOOP
  219.  
  220.         // Lee las teclas y mueve la nave
  221.         IF (key(_right) AND velocidad<6)
  222.             velocidad+=2;
  223.         ELSE
  224.             IF (velocidad>0)  velocidad--; END
  225.         END
  226.         IF (key(_left) AND velocidad>-6)
  227.             velocidad-=2;
  228.         ELSE
  229.             IF (velocidad<0)  velocidad++; END
  230.         END
  231.         x+=velocidad;
  232.  
  233.         IF (x>310)  // Limites de la pantalla
  234.             x=310;
  235.             velocidad=0;
  236.         END
  237.         IF (x<10)
  238.             x=10;
  239.             velocidad=0;
  240.         END
  241.  
  242.         IF (key(_space) OR key (_control))      // Dispara misil
  243.             IF (bandera_misil==0)               // Mira si hay otro disparado
  244.                 sound(laser,40,50);
  245.                 bandera_misil=1;
  246.                 misil(x,y-10);
  247.             END
  248.         END
  249.  
  250.         FRAME;
  251.     END
  252. END
  253.  
  254. //------------------------------------------------------------------------------
  255. // Proceso misil
  256. // La nave lanza un misil.
  257. // Simplemente va hacia arriba (y-=8).
  258. //------------------------------------------------------------------------------
  259.  
  260. PROCESS misil(x,y);
  261.  
  262. BEGIN
  263.     graph=14;           // Selecciona gráfico
  264.     REPEAT
  265.         y-=8;
  266.         IF (graph==14)  // Cambia el gráfico (entre 14 y 15)
  267.             graph=15;
  268.         ELSE
  269.             graph=14;
  270.         END
  271.  
  272.         FRAME;
  273.     UNTIL (out_region(id,0))    // Repite mientras el objeto este en pantalla
  274.     bandera_misil=0;
  275. END
  276.  
  277. //------------------------------------------------------------------------------
  278. // Proceso fuego
  279. // El fuego enemigo va hacia abajo(sentencia y+=300) en cada impresión, y
  280. // va hacia a la nave en dirección x (sentencia x+=x_avance).
  281. //------------------------------------------------------------------------------
  282.  
  283. PROCESS fuego(x,y,tipo_fuego);
  284.  
  285. PRIVATE
  286.     id_proceso; // Identificador de la nave
  287.     x_avance;   //  Porcentaje horizontal para usar con coordenada y
  288.  
  289. BEGIN
  290.     graph=tipo_fuego;       // Selecciona gráfico
  291.     sound(laser2,256,300);  // Realiza sonido
  292.     resolution=100;         // Usa dos decimales
  293.  
  294.     IF (idnave.y==y)        // Si la nave esta en la vertical el incremento horizontal es 0
  295.         x_avance=0;
  296.     ELSE
  297.         // Calcula el x_avance
  298.         // *100 hace dos decimales
  299.         // *3 porque el fuego se mueve 3 puntos cada vez
  300.  
  301.         x_avance=(((idnave.x-x)*resolution)*3)/(idnave.y-y);
  302.  
  303.         // Máxima velocidad. Esta puede ser 0 si el disparo es vertical
  304.         IF (x_avance>100) x_avance=100; END
  305.         IF (x_avance<-100) x_avance=-100; END
  306.     END
  307.  
  308.     y=y*resolution; // Convierte coordenadas a la resolución 100
  309.     x=x*resolution;
  310.  
  311.     REPEAT
  312.         IF ((graph==16) OR (graph==17)) // Cambia el gráfico
  313.             IF (graph=16)
  314.                 graph=17;
  315.             ELSE
  316.                 graph=16;
  317.             END
  318.         END
  319.         // Mueve al proceso
  320.         y+=300;
  321.         x+=x_avance;
  322.  
  323.         // Comprueba si ha tocado la nave
  324.         IF (id_proceso=collision(TYPE nave))
  325.             // Crea un proceso tipo explosión
  326.             explosion(id_proceso.x,id_proceso.y,100);
  327.             sound(explo,80,100);
  328.             // Elimina los procesos de tiro y de la nave
  329.             signal(id_proceso,s_kill);
  330.             signal(id,s_kill);
  331.             otra_vida=1;       // Prepara para luego quitar una vida
  332.         END
  333.         FRAME;
  334.     UNTIL (out_region(id,0))
  335.  
  336. END
  337.  
  338. //------------------------------------------------------------------------------
  339. // Proceso enemigo
  340. // Proceso para las naves enemigas
  341. // 1-crea el enemigo y lo pone en la posición dentro del escuadrón.
  342. // 2-controla la acción del enemigo cuando la variable indique que baje.
  343. // Empieza con abajo=0 (Quedarse en la posición de escuadrón).
  344. //------------------------------------------------------------------------------
  345.  
  346. PROCESS enemigo(numero_enemigo,enemigo_tipo);
  347.  
  348. PRIVATE
  349.     fila;               // Filas y columnas del escuadrón
  350.     col;
  351.     num_aleatorio;      // Para números aleatorios
  352.     id_proceso;         // Identificador de uso general.
  353.     ahora=0;            // Numero de animación
  354.     animacion[]=        // Configuración de la animación
  355.         8,9,10,11,10,9;
  356.     abajo=0;            // 0=Posicion de escuadrón, 1=ataque,
  357.                         // 3=retorna a la posición de escuadrón
  358.     velocidad;          // Velocidad horizontal cuando atacan
  359.  
  360. BEGIN
  361.     numero=numero_enemigo;
  362.  
  363.     fila=numero/ancho_escuadron;    // Fila y columna de la posición en escuadrón
  364.     col=numero MOD ancho_escuadron;
  365.  
  366.     x=col*ancho_nave+x_escuadron;   // Selecciona posición inicial
  367.     y=fila*alto_nave+y_escuadron;
  368.  
  369.     SWITCH (enemigo_tipo)           // Selecciona el gráfico del enemigo
  370.         case 1: graph=2; END
  371.         case 2: graph=animacion[0]; END
  372.         case 3: graph=12; END
  373.     END
  374.  
  375.     LOOP
  376.         IF (enemigo_tipo==1)        // Animación de enemigos tipo 1
  377.             graph++;
  378.             IF (graph==7) graph=2; END
  379.         END
  380.  
  381.         IF (enemigo_tipo==2)        // Animación de enemigos tipo 2
  382.             ahora++;
  383.             IF (ahora>5) ahora=0; END
  384.             graph=animacion[ahora];
  385.         END
  386.  
  387.         IF (y<130)                  // Puede disparar si vuela bajo
  388.             num_aleatorio=rand(0,1500);     // Porcentaje de disparo
  389.             IF (enemigo_tipo==3 AND num_aleatorio<=nivel*2)
  390.                 fuego(x,y+4,18);
  391.             END
  392.             IF (enemigo_tipo==2 AND num_aleatorio<=nivel)
  393.                 fuego(x,y+4,16);
  394.             END
  395.         END
  396.  
  397.         IF (abajo==1)           // Ataca la nave
  398.             y+=2;
  399.             // Comprueba si ha salido de pantalla
  400.             IF (out_region(id,0))
  401.                 // Cambia las coordenadas a arriba
  402.                 y=0;
  403.                 x=col*ancho_nave+x_escuadron;
  404.                 abajo=3;
  405.             END
  406.             IF (x>idnave.x)     // Va hacia la nave del jugador
  407.                 IF (velocidad>-enemigo_tipo-2) velocidad--; END
  408.             ELSE
  409.                 IF (velocidad<enemigo_tipo+2) velocidad++; END
  410.             END
  411.             x+=velocidad;
  412.         END
  413.  
  414.         IF (abajo==3)           // Retorna a la posición de escuadrón
  415.             y++;
  416.             IF (y==fila*alto_nave+y_escuadron) abajo=0; END
  417.             // Si hay menos enemigos que el nivel por 3 vuelve a bajar
  418.             IF (enemigos<nivel*3) abajo=1; END
  419.         END
  420.  
  421.         IF ((abajo==0) OR (abajo==3)) // Mueve al escuadrón
  422.             num_aleatorio=rand(1,4000);
  423.             // Aleatoriamente y según el nivel hace que el proceso baje
  424.             IF (num_aleatorio<nivel*2)
  425.                 abajo=1;
  426.                 IF (enemigo_tipo==3)
  427.                     SOUND(ataque3,200,300);
  428.                 END
  429.                 IF (enemigo_tipo==1)
  430.                     SOUND(ataque1,200,300);
  431.                 END
  432.             END
  433.  
  434.             IF (dir==0)         // Si la dirección es hacia la izquierda
  435.                 x-=movi_escuadron;
  436.  
  437.                 // Cuando no se pueda mover a la izquierda cambia de dirección
  438.                 IF (x<20) cambia_dir=1; END
  439.  
  440.             ELSE                // Si la dirección es a la derecha
  441.                 x+=movi_escuadron;
  442.                 IF (x>300) cambia_dir=1; END // Cambia la dirección
  443.             END
  444.         END
  445.  
  446.         // Mata la nave del jugador cuando colisione con ella
  447.         IF (id_proceso=collision(TYPE nave))
  448.             otra_vida=1;
  449.             signal(id_proceso,s_kill);
  450.         ELSE
  451.             IF (id_proceso=collision(TYPE misil))  // Elimina la nave
  452.                 signal(id_proceso,s_kill);
  453.                 puntuacion+=10;                    // Y suma puntos
  454.                 // Comprueba lass vidas extras
  455.                 IF (puntuacion MOD 1000==0) vidas++; END
  456.                 bandera_misil=0;        // Deja misiles en preparado
  457.             END
  458.         END
  459.  
  460.         IF (id_proceso)                 // El enemigo muere
  461.             enemigos--;
  462.             tipo_enemigo[numero]=0;     // Quita al enemigo de la formación
  463.             IF (enemigos==0) siguiente_nivel=1; END
  464.             explosion(x,y,100);         // y elimina el proceso haciendo un sonido y una explosion
  465.             sound(explo,80,100);
  466.             signal(id,s_kill);
  467.         END
  468.         FRAME;
  469.     END
  470. END
  471.  
  472. //------------------------------------------------------------------------------
  473. // Proceso explosion
  474. // Genera una explosión de forma aleatoria
  475. //------------------------------------------------------------------------------
  476.  
  477. PROCESS explosion(x,y,size);
  478.  
  479. BEGIN
  480.     graph=19;               // Selecciona gráfico
  481.     REPEAT
  482.         IF (size>50 AND rand(0,100)<size/8) // Crea otras explosiones
  483.             CLONE
  484.                 x+=rand(-8,8);
  485.                 y+=rand(-8,8);
  486.             END
  487.         END
  488.         size-=4;            // Cambia de tamaño reducciendose
  489.         FRAME;
  490.     UNTIL (size<25)         // Continua hasta que sea demasiado pequeño
  491. END
  492. //------------------------------------------------------------------------------
  493. // Proceso creditos
  494. // Imprime los mensajes de creditos
  495. //------------------------------------------------------------------------------
  496. PROCESS creditos()
  497.  
  498. PRIVATE
  499.     fuentec;            // Fuente para los créditos
  500.  
  501. BEGIN
  502.     // Apaga la pantalla
  503.     fade_off();
  504.     delete_text(all_text);  // Borra otros textos
  505.     put_screen(1,2);        // Muestra la pantalla de presentacion
  506.  
  507.     // Carga la fuente de letras
  508.     fuentec=load_fnt("galax\galax2.fnt");
  509.  
  510.     // Imprime textos
  511.     write(fuentec,160,30,4,"- CREDITOS -");
  512.     write(fuentec,160,60,4,"PROGRAMADOR: LUIS SUREDA");
  513.     write(fuentec,160,80,4,"GRAFICOS: JOSE FERNANDEZ");
  514.     write(fuentec,160,100,4,"SONIDOS: CARLOS ILLANA");
  515.     write(fuentec,160,120,4,"COPYRIGHT 1997");
  516.     write(fuentec,160,140,4,"DIV GAMES STUDIO");
  517.     fade_on();  // Enciende la pantalla
  518.  
  519.     // Espera hasta que se pulse la barra espaciadora
  520.     scan_code=0;
  521.     WHILE (scan_code==0)
  522.         FRAME;
  523.     END
  524.     fade_off();
  525.     exit("Gracias por jugar!",0);   // Sale del juego
  526. END
  527.